package Servicios;

import DAO.ReservaSalaDAO;
import DAO.SalaDAO;
import Entidad.ReservaSala;
import Entidad.Sala;
import Singletons.Mensajes;
import VO.ReservaSalaVO;
import VO.SalaVO;
import java.util.ArrayList;
import java.util.Calendar;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;

public class ServicioSala {

    /**
     * <p> este metodo retorna el estado de una reserva de
     * sala ("EN_ESPERA","CUMPLIDA","INCUMPLIDA")</p>
     * @param reservaSala
     * @return un entero que representa el estado de una sala
     */
    public int estadoReservaSala(ReservaSala reservaSala) {
        String horarioPrestamo = reservaSala.getHorarioPrestamo();
        if(horarioPrestamo==null){
            return Mensajes.RESERVADA;
        }
        else{
            if(horarioPrestamo.substring(6, 11).equals("--:--")){
                return Mensajes.OCUPADA;
            }
            else{
                return Mensajes.DISPONIBLE;
            }
        }
    }
    /**
     * <p> busca una sala con el id dado y la convierte en un SalaVO </p>
     * @param idSala
     * @return Objeto con la informacion de una sala
     */
    public SalaVO leerSala(Long idSala,EntityManager em) throws PersistenceException {
        SalaDAO sdao = new SalaDAO();
        Sala s = null;
        try{
            s = sdao.Buscar(idSala,em);
        }catch(PersistenceException e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);

        }catch(Exception e){
            return null;
        }
        if(s==null){
            return null;
        }
        SalaVO svo = new SalaVO();
        svo.setEdificio(s.getEdificio().getNombre());
        svo.setHorarioSabado(s.getHorarioSabado());
        svo.setHorarioSemana(s.getHorarioSemana());
        svo.setId(s.getId());
        svo.setNombre(s.getNombre());
        svo.setNumero(s.getNumero());
        svo.setUrlFondo(s.getUrlFondo());
        return svo;
    }

    /**
     * <p> busca una sala que tenga el nombre que se le pasa a esta funcion </p>
     * @param nombre
     * @param em entity manager
     * @return objeto con la informacion de la sala
     */
    public SalaVO buscarPorNombre(String nombre,EntityManager em) {
        SalaDAO sdao = new SalaDAO();
        Sala sala = sdao.buscarPorNombre(nombre, em);
        if (sala!=null){
            SalaVO svo = new SalaVO();
            svo.setEdificio(sala.getEdificio().getNombre());
            svo.setHorarioSabado(sala.getHorarioSabado());
            svo.setHorarioSemana(sala.getHorarioSemana());
            svo.setId(sala.getId());
            svo.setNombre(sala.getNombre());
            svo.setNumero(sala.getNumero());
            svo.setUrlFondo(sala.getUrlFondo());
            return svo;
        }else{
            return null;
        }
    }
    /**
    * <p> este metodo busca las reservas que tenga una sala y
    * compara las fechas de las reservas con la fecha actual, si
    * existe alguna reserva que contenga la fecha actual, se devuelve un VO con
     * informacion sobre esa reserva</p>
    * @param idSala
    * @return objeto con la informacion de una reserva de sala
    */
    public ReservaSalaVO buscarReservaActual(long idSala,EntityManager em) throws PersistenceException {
        Calendar fechaActual = Calendar.getInstance();
        ReservaSalaDAO dao = new ReservaSalaDAO();
        Sala s = new SalaDAO().Buscar(idSala, em);
        ArrayList<ReservaSala> listaActual= null;
        try{
            listaActual = dao.lista(em);
        }catch(PersistenceException e){
            throw new PersistenceException
                    (Mensajes.ERROR_CONEXION_BD);
        }
        ArrayList<ReservaSala> reservas= new ArrayList<ReservaSala>();
        for(ReservaSala u : listaActual){
            if(u.getSala().getId()==idSala) reservas.add(u);
        }
        ReservaSalaVO Reserva=null;
        for(ReservaSala u : reservas){
            if(u.getHorarioPrestamo()==null){}
            else if(u.getHorarioPrestamo().equals(Mensajes.FALLA_RESERVA)) continue;
            Calendar f1 = Calendar.getInstance();
            f1.setTime(u.getFecha());
            if(f1.get(Calendar.MONTH)==fechaActual.get(Calendar.MONTH) && f1.get(Calendar.DATE)==fechaActual.get(Calendar.DATE)){
                String horaReserva = u.getHorarioReserva();
                int horaInicio = Integer.parseInt(horaReserva.substring(0,2));
                int minInicio = Integer.parseInt(horaReserva.substring(3,5));
                int horaFin = Integer.parseInt(horaReserva.substring(6,8));
                int minFin = Integer.parseInt(horaReserva.substring(9,11));
                Calendar fechaInicio = Calendar.getInstance();
                fechaInicio.set(Calendar.HOUR_OF_DAY , horaInicio);
                fechaInicio.set(Calendar.MINUTE , minInicio);
                Calendar fechaFin = Calendar.getInstance();
                fechaFin.set(Calendar.HOUR_OF_DAY , horaFin);
                fechaFin.set(Calendar.MINUTE , minFin);
                if(fechaActual.after(fechaInicio) && fechaActual.before(fechaFin)){
                    int estado = estadoReservaSala(u);
                    if(estado==Mensajes.DISPONIBLE){
                        continue;
                    }else{
                        Reserva = new ReservaSalaVO();
                        Reserva.setId(u.getId());
                        Reserva.setAdministrador(u.getAdministrador().getNombre());
                        Reserva.setEstado(estado);
                        Reserva.setHorarioPrestamo(u.getHorarioPrestamo());
                        Reserva.setHorarioReserva(u.getHorarioReserva());
                        Reserva.setSala(u.getSala().getNombre());
                        Reserva.setProfesor(u.getProfesor());
                        break;
                    }
                }
            }
        }
        return Reserva;
    }

    public ArrayList<SalaVO> listaSalas(EntityManager em) throws PersistenceException {
        SalaDAO sdao = new SalaDAO();
        ArrayList <Sala>  listaSalas= sdao.listaActual(em);
        ArrayList <SalaVO> arraylistSalaVOs = new ArrayList<SalaVO>();     
        for (Sala s:listaSalas){
         arraylistSalaVOs.add(new SalaVO(s.getId(),
                    s.getNombre(),
                    s.getNumero(),
                    s.getEdificio().getNombre(),
                    s.getUrlFondo(),
                    s.getHorarioSemana(),
                    s.getHorarioSabado()));
        }
        return arraylistSalaVOs;
    }

    public boolean editarSala (SalaVO sala, EntityManager em){
        SalaDAO dao = new SalaDAO();
        Sala sal = dao.Buscar(sala.getId(), em);
        sal.setNumero(sala.getNumero());
        sal.setNombre(sala.getNombre());
        sal.setHorarioSemana(sala.getHorarioSemana());
        sal.setHorarioSabado(sala.getHorarioSabado());
        try{
            dao.Actualizar(sal, em);
        }catch (Exception e){
            return false;
        }
        return true;
    }

}
